import os
import logging
from datetime import datetime


class LoggerUtils:
    """日志工具类，提供统一的日志配置和获取方法"""

    _loggers = {}
    _default_log_dir = None

    @classmethod
    def _init_log_dir(cls):
        """初始化日志目录"""
        if cls._default_log_dir is None:
            # 获取默认日志目录路径，与原tcp_server.py保持一致
            cls._default_log_dir = os.path.join(
                os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))),
                'logs'
            )
            os.makedirs(cls._default_log_dir, exist_ok=True)

    @classmethod
    def get_logger(cls, name: str = 'main', log_dir: str = None, level: int = logging.INFO):
        """
        获取或创建一个logger实例
        
        Args:
            name: logger名称
            log_dir: 日志目录，如果为None则使用默认目录
            level: 日志级别
        
        Returns:
            logging.Logger: 配置好的logger实例
        """
        # 如果logger已经存在，直接返回
        if name in cls._loggers:
            return cls._loggers[name]
        
        # 初始化日志目录
        cls._init_log_dir()
        
        # 使用指定的日志目录或默认目录
        current_log_dir = log_dir if log_dir else cls._default_log_dir
        os.makedirs(current_log_dir, exist_ok=True)
        
        # 获取当前日期，格式为年月日
        current_date = datetime.now().strftime('%Y%m%d')
        
        # 为不同的logger创建不同的日志文件
        file_name = f'{name.lower()}{current_date}.log' if name != 'main' else f'application{current_date}.log'
        log_file = os.path.join(current_log_dir, file_name)
        
        # 创建logger
        logger = logging.getLogger(name)
        logger.setLevel(level)
        
        # 移除所有已有的处理器
        for handler in logger.handlers[:]:
            logger.removeHandler(handler)
        
        # 创建文件处理器
        file_handler = logging.FileHandler(log_file, encoding='utf-8')
        file_handler.setLevel(level)
        
        # 设置日志格式
        formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
        file_handler.setFormatter(formatter)
        
        # 添加处理器到logger
        logger.addHandler(file_handler)
        
        # 保存到缓存
        cls._loggers[name] = logger
        
        return logger